#ifndef PCANRECEIVER_H
#define PCANRECEIVER_H

#include <QObject>
#include <QThread>
#include <QMutex>
#include "recvcanprotmanager.h"
#include "PCANBasic.h"

class PCANReceiver : public QObject
{
    Q_OBJECT
public:
    explicit PCANReceiver(QObject *parent = nullptr);
    ~PCANReceiver();

    //设置滤波规则
    bool setupCanFilter();

    // 初始化PCAN设备
    bool init(const QString& configPath, TPCANHandle handle = PCAN_USBBUS1, 
             int bitrate = PCAN_BAUD_500K);
    
    // 开始接收数据
    void startReceiving();

    //定时发送数据
    bool sendCanData(quint32 msgId, const QByteArray &data);
    
    // 停止接收数据
    void stopReceiving();

    //设备断开接口：关闭连接、停止线程、重置状态
    void disconnectDevice();
    
    // 检查设备是否已连接
    bool isConnected() const { return m_connected; }

signals:
    // 接收到解析后的信号
    void signalReceived(const QString& msgName, quint32 msgId, const QByteArray& data,
                                 const QString& sigName, double physValue, const QString& valueDesc);
    // 错误信息
    void errorOccurred(const QString& errorMsg);
    // 设备连接状态变化
    void connectionStatusChanged(bool connected);

private slots:
    // 接收数据的工作函数
    void receiveLoop();

private:
    // 转换PCAN错误码为字符串
    QString getErrorString(TPCANStatus status);
    
    // 解析接收到的CAN消息
    void processCanMessage(const TPCANMsg& msg);

    RecvCANProtManager m_protManager;  // 协议管理器
    QThread m_receiveThread;           // 接收线程
    TPCANHandle m_handle;              // PCAN设备句柄
    bool m_connected;                  // 连接状态
    bool m_running;                    // 接收循环标志
    QMutex m_mutex;                    // 线程同步锁
};

#endif // PCANRECEIVER_H
